package jass.generators;
import jass.engine.*;

/**
   A force model based on stick slip model. Just load a period of sawtooth.
   @author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class StickSlipSimple extends Impulse {

    private float srate; // sampling rate in Hertz
    private float v_crit; // critical velocity: no stick slip above this
    private float k_over_mu = 1; // spring const/coeff. of friction
    private float fn_min; // min, normal force: no stick slip if below this

    private float v=1; // external slide velocity in m/s
    private float fn=1; // external normal force in Newton
    
    /** Construct force.
        @param srate sampling rate in Hertz.
        @param bufferSize bufferSize of this Out.
    */
    public StickSlipSimple(float srate, int bufferSize) {
        super(srate,bufferSize);
        reset();
    }

    /** Set model pars
        @param k_over_mu k/mu
        @param fmin min. norm. force below which no output
        @param vcrit max speed above which no output
    */
    public void setModelParameters(float k_over_mu,float fmin,float vcrit) {
        this.k_over_mu = k_over_mu;
        this.fn_min = fmin;
        this.v_crit = vcrit;
    }

    /** Set velocity and force
        @param v velocity in m/s
    */
    public void setContactProperties(float vel,float force) {
        // freq. is k_over_mu * v/fn
        if(vel > v_crit || force < fn_min) { // no sound
            v = 0;
            fn = 0;
            super.setVolume(0);
        } else {
            v = vel;
            fn = force;
            float period = fn/(k_over_mu * v);
            super.setVolume(fn);
            super.setPeriod(period);
        }
    }

}




